/******************************************************************************
 * \brief	在软件模块中支持缓存队列
 * \details	可以让模块之间的数据传输具有缓冲机制
 * \author	将狼才鲸
 * \date	2023-03-08
 ******************************************************************************/

#ifndef _MODULE_BUFFER_H_
#define _MODULE_BUFFER_H_

#include "queue_buffer.h"
#include "queue_buffer_cfg.h"

#define MODULE_NAME_MAX_LEN	32	/* 模块名称最长的字符数 */

/* 模块类型，模块ID */
enum {
	MOD_NONE,
	MOD_SYS,
	MOD_TTY,
	MOD_FILE,
	MOD_DEBUG
};

/* 模块缓存组别 */
enum {
	MOD_GROUP_SYS,
	MOD_GROUP_USER,
	MOD_GROUP_DEBUG,
	MOD_GROUP_MAX
};

/* 一个供模块使用的缓存 */
typedef struct _mod_buf {
	qbuf_t *qbuf;	/* 一个系统缓存 */
	int group_id;	/* 模块缓存组别: MOD_GROUP_SYS... */
} mod_buf_t;

/* 模块中要使用缓存的话，需要定义此模块结构体 */
typedef struct _mod_context {
	const char name[MODULE_NAME_MAX_LEN];	/* 模块名称字符串 */
	const uint32_t mod_id;	/* 模块类型：MOD_SYS... */
	queue_entry_t qentry;	/* 每个模块维护自己独有的缓存队列 */
	void (*bufchange)(mod_buf_t **p_mbuf);	/* 缓存不加入队列，立即处理 */
} mod_context_t;

/* 模块中操作缓存的API */

/**
 * \brief	初始化指定模块的缓存队列
 * \param	modc:	要操作的模块上下文结构体指针
 */
extern void modbuf_init(mod_context_t *modc);

/**
 * \brief	清除指定模块中从指定缓存组来的缓存
 * \param	gid:	要清除的缓存组名
 */
extern void modbuf_destroy_by_group(mod_context_t *modc, int gid);

/**
 * \brief	清除指定模块中所有缓存组的缓存
 */
extern void modbuf_destroy(mod_context_t *modc);

/**
 * \brief	向指定模块的指定缓存组发送一个缓存
 * \note	发送缓存前需向系统缓存申请一个，作为传入的qbuf参数
 */
extern mod_buf_t *modbuf_push(mod_context_t *modc, int gid, qbuf_t *qbuf);

/**
 * \brief	从指定模块的指定缓存组弹出一个缓存
 */
extern qbuf_t *modbuf_pop(mod_context_t *modc, int gid);

/**
 * \brief	查询指定模块的指定缓存组内已缓存的个数
 */
extern int modbuf_count(mod_context_t *modc, int gid);

/* 全局API */
/**
 * \brief	初始化所有和模块绑定的缓存变量
 * \details	各模块初始化前，在主函数中预先调用
 */
extern void modbuf_pre_init(void);

#endif /* _MODULE_BUFFER_H_ */
